class Solution 
{
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) 
    {
        int left = 0, right = matrix[0].size(), top = 0, bottom = matrix.size();
        vector<int> ret;
        while (left < right && top < bottom) 
        {
            for (int i = left; i < right; ++i)  // 从左到右遍历最上面一行
            {
                ret.push_back(matrix[top][i]);
            }
            if (++top >= bottom) // 最上面一行遍历完修改matrix的top边界，修改后>=就遍历完了
                break; // 如果已经遍历完matrix就结束，防止matrix只有一行或只有一列
            
            for (int j = top; j < bottom; ++j) // 从上到下遍历最右边一列
            {
                ret.push_back(matrix[j][right - 1]);
            }
            if (left >= --right)  // 最右边一列遍历完修改matrix的right边界
                break;
            
            for (int j = right - 1; j >= left; --j) // 从右到左遍历最下面一行
            {
                ret.push_back(matrix[bottom - 1][j]);
            }
            if (top >= --bottom)  // 最下面一行遍历完修改matrix的bottom边界
                break;
            
            for (int i = bottom - 1; i >= top; --i) // 从下到上遍历最左边一列
            {
                ret.push_back(matrix[i][left]);
            }
            ++left; // 下次进入循环会判断
        }
        return ret;
    }
};